﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data.SqlClient;
using System.Data;
using System.Windows.Forms;

namespace Factory
{
    class UsuarioDAO
    {
        public static IList<Usuario> obtemListaUsuarios()
        {
            try
            {
                DAOBase m_cnn = new DAOBase();

                #region Query
                string query =
                    @"SELECT ID, Documento, Login, Senha, FlagAdministrador
                FROM Usuario";
                #endregion

                SqlCommand cmd = new SqlCommand(query, m_cnn.CreateConnection());

                SqlDataReader dr = cmd.ExecuteReader();

                IList<Usuario> Usuarios = ReaderToObjects(dr);

                return Usuarios;
            }
            catch (Exception e)
            {
                MessageBox.Show(e.Message);
                return null;
            }
        }

        public static IList<Usuario> ReaderToObjects(IDataReader reader)
        {
            if (reader.IsClosed)
            {
                throw new ArgumentException("O DataReader fornecido já estava fechado.");
            }

            int Id = reader.GetOrdinal("ID");
            int login = reader.GetOrdinal("Login");
            int cpf = reader.GetOrdinal("Documento");
            int senha = reader.GetOrdinal("Senha");
            int flagAdmin = reader.GetOrdinal("FlagAdministrador");

            IList<Usuario> result = new List<Usuario>();

            while (reader.Read())
            {
                int flag = reader.GetInt32(flagAdmin);
                Usuario c = new Usuario(
                    reader.GetInt32(Id),
                    reader.GetString(cpf),
                    reader.GetString(login),
                    reader.GetString(senha),
                    flag
                    );
                result.Add(c);
            }
            return result;
        }

        public int CadastrarUsuario(Usuario Usuario)
        {
            int resultado = 0;

            try
            {

                DAOBase m_cnn = new DAOBase();

                #region query
                string query = @"INSERT INTO Usuario
                                              VALUES
                                               (@Login,@Senha,@TipoAdministrador,@Documento)";

                #endregion

                SqlCommand cmd = new SqlCommand(query, m_cnn.CreateConnection());

                //Parametros de Usuario
                cmd.Parameters.Add(new SqlParameter("Documento", Usuario.cpf));
                cmd.Parameters.Add(new SqlParameter("Login", Usuario.Login));
                cmd.Parameters.Add(new SqlParameter("Senha", Usuario.Senha));
                cmd.Parameters.Add(new SqlParameter("TipoAdministrador", Usuario.TipoFuncionario));


                resultado = cmd.ExecuteNonQuery();

                m_cnn.DestroyConnection();

            }

            catch (Exception ex)
            {
                //writer.WriteLine("ApplicationException Message: {0}", ex.Message);
            }

            return resultado;
        }

        public IList<Usuario> ObterUsuarios()
        {
            try
            {
                DAOBase m_cnn = new DAOBase();

                #region Query
                string query =
                    @"SELECT ID, Documento, Login, Senha, FlagAdministrador
                FROM Usuario";
                #endregion

                SqlCommand cmd = new SqlCommand(query, m_cnn.CreateConnection());

                SqlDataReader dr = cmd.ExecuteReader();

                IList<Usuario> Usuarios = ReaderToObjects(dr);

                return Usuarios;
            }
            catch (Exception e)
            {
                MessageBox.Show(e.Message);
                return null;
            }
        }

        public int atualizarUsuario(Usuario Usuario)
        {
            int resultado = 0;

            try
            {
                DAOBase m_cnn = new DAOBase();

                #region query
                string query = @"UPDATE Usuario
                                   SET Documento =@Documento
                                      ,Login = @Login
                                      ,Senha = @Senha
                                      ,FlagAdministrador = @TipoAdministrador
                                 WHERE ID=@ID";

                #endregion

                SqlCommand cmd = new SqlCommand(query, m_cnn.CreateConnection());

                //Parametros de Usuario
                cmd.Parameters.Add(new SqlParameter("ID", Usuario.Id));
                cmd.Parameters.Add(new SqlParameter("Documento", Usuario.cpf));
                cmd.Parameters.Add(new SqlParameter("Login", Usuario.Login));
                cmd.Parameters.Add(new SqlParameter("Senha", Usuario.Senha));
                cmd.Parameters.Add(new SqlParameter("TipoAdministrador", Usuario.TipoFuncionario));


                resultado = cmd.ExecuteNonQuery();

                m_cnn.DestroyConnection();

            }

            catch (Exception ex)
            {
                //writer.WriteLine("ApplicationException Message: {0}", ex.Message);
            }

            return resultado;
        }

        public Usuario ObterUsuariosPorId(int id)
        {
            try
            {
                DAOBase m_cnn = new DAOBase();

                #region Query
                string query =
                    @"SELECT ID, Documento, Login, Senha, FlagAdministrador
                FROM Usuario WHERE ID=@id ";
                #endregion

                SqlCommand cmd = new SqlCommand(query, m_cnn.CreateConnection());
                cmd.Parameters.Add(new SqlParameter("id", id));
                SqlDataReader dr = cmd.ExecuteReader();

                IList<Usuario> Usuarios = ReaderToObjects(dr);

                return Usuarios.FirstOrDefault();
            }
            catch (Exception e)
            {
                MessageBox.Show(e.Message);
                return null;
            }
        }

        public int ExcluirUsuario(int idUsuario)
        {
            int resultado = 0;

            try
            {
                DAOBase m_cnn = new DAOBase();

                #region query
                string query = @"DELETE FROM Usuario
                                 WHERE ID=@ID";

                #endregion

                SqlCommand cmd = new SqlCommand(query, m_cnn.CreateConnection());
                cmd.Parameters.Add(new SqlParameter("ID", idUsuario));

                resultado = cmd.ExecuteNonQuery();

                m_cnn.DestroyConnection();

            }

            catch (Exception ex)
            {

            }

            return resultado;
        }
    }
}
